package add__2_basalsyntax;

/*

&
同1取1 
0 & 0 = 0
1 & 0 = 0
0 & 1 = 0
1 & 1 = 1
x & 0 = 0 // 清零 0 
x & 1 = x // 取位 (x 为二进制下的 某一位)
取位, 清零，判定奇偶
1) n & 1        // 判断奇偶性
2) n & (n - 1)  // 去除最低位 1 用途:求 1 的个数, 判断是否为 2 的整数次幂
3) n & -n       // lowbit 取出最低位 1 00...
4) n >> k & 1   // 取出 n 的第 k 位
5）n & ((1 << k) - 1)    // 取出前 k 位
6) n & (~(1 << k))      // 清零第 k 位


|
同0取0，有1取1
0 | 0 = 0
1 | 0 = 1
0 | 1 = 1
1 | 1 = 1
x | 1 = 1 // 赋值 1 
x | 0 = x
赋值 1, 
1) n | 1 << k   // 赋值 n 的第 k 位为 1
2) 


~
取反 : ~0 = 1; ~1 = 0


^
同0异1 : 0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 1
0 ^ 0 = 0
1 ^ 0 = 1 
1 ^ 1 = 0
0 ^ 1 = 1
x ^ 0 = x // 原位 
x ^ 1 = ~x // 取反 
性质 :
 a ^ a = 0 ; 
 a ^ 0 = a ; 
 a ^ b = b ^ a ; 
 a ^ b ^ c = (a ^ b) ^ c = a ^ (b ^ c) ; 
 a ^ b ^ a = b ; 
应用 : 取反, 
1) n ^ 1        // 取反 n 的最低位
2) n ^ 1 << k   // 取反 n 的第 k 位
3) a ^ b = c ==> b ^ c = b ^ a ^ b = a ^ (b ^ b) = a    // 异或的逆运算


<< 和 >>
2 次幂 相关
1）1 << n        // 2 的 n 次幂
2) n << k       // n * (2 的 k 次幂), 最低位后面 添 0
3) n << k + 1   // 最低位后面 添 1
4) n >> k       // n / (2 的 k 次幂), 去除最低位


技巧
n >> k & 1          // 取出整数 n 在二进制下的第 k 位 
n & ((1 << k) - 1)  // 取出整数 n 在二进制下的前 k 位
n ^ 1 << k          // 把整数 n 在二进制下的第 k 位取反
n | 1 << k          // 对整数 n 在二进制下的第 k 位赋值 1 
n & (~(1 << k))     // 对整数 n 在二进制下的第 k 位赋值 0  





 */
public class BitOperation {

    public static void main(String[] args) {
        

    }

}
